iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0
Cloud Native

【하나, 둘, ready, get set, go】系列 第 26

【하나, 둘, ready, get set, go】Day 26 - 將服務打包成多架構 Docker Image

  • 分享至 

  • xImage
  •  

前情提要

在前面幾天,我們實際操作了使用 GORM 來與 SQL 資料庫進行互動,也使用 Gin 來開發 Web Backend API,並相互整合在一起

今天要來進行跟這次參賽主題 Cloud Native 有關的事,也就是要來進行包 Docker Image,讓我們的服務可以跑在 Container 上

下面我們就來實際操作吧

實際操作

安裝 Docker Desktop

要進行 Docker Image 前,首先我們要先確定電腦上已經有安裝好 docker 環境了

這邊我們可以到 Docker 官網 來下載 Docker Desktop

選擇自己電腦版本下載及安裝即可!

Docker Desktop 下載

支線開啟,多架構是啥?

安裝好 Docker Desktop 後,我們的 docker 環境就安裝好啦~

接下來就要來撰寫打包 Docker Image 的重要檔案 - Dockerfile (注意,沒有副檔名喔!)

這邊我們要打包出來的 Docker Image 會是屬於多架構的,下面就來說明為什麼要打包成多架構的 Docker Image 啦

Docker Image 預設的系統架構會是跟 執行打包作業的電腦 相同

也就是說

如果你用 x86_64 架構的電腦進行打包,打包出來的 Docker Image 就會是 x86_64 架構的 (俗稱:amd64)

反之,如果你用 ARM 架構的電腦進行打包 (Ex:Apple M2 Ultra),打包出來的 Docker Image 就會是 ARM 架構的 (俗稱:arm64),兩個架構之間是不互通的

所以說,如果想讓你的應用,可以同時執行在不同架構上的話,那麼就需要進行多架構打包啦~

Dockerfile 撰寫

說明完什麼是多架構後,就要來撰寫 Dockerfile 啦~

再次說明,Dockerfile 是沒有副檔名的!

FROM golang:latest

RUN mkdir -p /it15th

WORKDIR /it15th

COPY . .

ARG TARGETARCH

RUN go mod download && CGO_ENABLED=1 GOOS=linux GOARCH=${TARGETARCH} go build -o it15th

EXPOSE 8080

CMD [ "./it15th" ]

Dockerfile 說明

# 透過 golang:latest 這個由 Go 官方推出的 Docker Image 
# 來當作我們這個 Image 的 Base Image
FROM golang:latest
# 建立資料夾
# -p 代表如果該資料夾尚不存在的話,則自動建立該資料夾
RUN mkdir -p /it15th
# 設定工作目錄
WORKDIR /it15th
# 將所有檔案複製到 Image 的資料夾內 (.)
# 這邊有設定 WORKDIR (工作目錄),所以就是會複製到工作目錄底下
# 否則預設是複製到根目錄底下
COPY . .
# 因為我們最終是要打包成多架構的 Docker Image
# 所以這邊我們需要設定一個 TARGETARCH 的參數
# 在執行打包的時候傳入
ARG TARGETARCH
# Build
# 先將 go.mod 內用到的套件下載下來
# 接著編譯對應系統架構 (linux/amd64、linux/arm64) /it15th 底下的 go 檔案
RUN go mod download && CGO_ENABLED=1 GOOS=linux GOARCH=${TARGETARCH} go build -o it15th
#「宣告」要對外開放的 port 號
EXPOSE 8080
# 執行 docker run 時,會執行的指令
CMD [ "./it15th" ]

開始打包 Docker Image 啦

這邊我們就直接在 Terminal 下 docker build 就可以開始打包了

  • Parameters (自行替換成自己對應的)
    • DOCKER_HUB_USERNAME
      • 說明:Docker Hub 上的使用者名稱
    • IMAGE_NAME
      • 說明:這個 Image 的名稱
    • IMAGE TAG
      • 說明:這個 Image 的 tag
  • Flags
    • --no-cache
      • 說明:不使用快取 (Cache) 來進行打包
    • -t
      • 說明:添加 Image 的 tag
    • --platform
      • 說明:要打包的架構,像是 linux/amd64、linux/arm64 等
docker build --no-cache -t {DOCKER_HUB_USERNAME}/{IMAGE_NAME}:{IMAGE TAG} . --platform linux/amd64,linux/arm64

docker build

支線開啟,Docker 是如何進行多架構編譯的

在先前,如果下 docker build,是只能編譯單一架構的 Image
如果要多架構的話,需要先個別打包,再透過 docker manifest 進行合併

後來 Docker 約 2019 年的時候推出了 docker buildx 來解決這個問題

但一開始預設是沒有開啟的,畢竟是實驗性功能

而現在在較新版的 Docker Desktop 與 Docker Engine 則預設在執行 docker build 時,會預設調用 Buildx 來進行編譯,不用像先前需要使用 docker buildx build 來進行調用

推上 Docker Hub 囉

docker push {DOCKER_USERNAME}/{IMAGE_NAME}:{IMAGE_TAG}

https://ithelp.ithome.com.tw/upload/images/20230913/20140363yef10eukQH.png

推上 Docker Hub 後,就可以使用 Docker 來執行了

https://ithelp.ithome.com.tw/upload/images/20230913/20140363AoX0pE9p8c.png

總結

今天我們成功將服務包成 Docker Image,並推上 Docker Hub 上了

明天我們要來將今天上述的一連串操作進行自動化,也就是結合 CI/CD,我們會使用 GitLab CI 來完成

那麼我們就明天見啦~

相關資源

  1. Docker Build architecture (https://docs.docker.com/build/architecture/)
  2. Multi-platform images (https://docs.docker.com/build/building/multi-platform/)
  3. Docker Buildx GitHub (https://github.com/docker/buildx)

上一篇
【하나, 둘, ready, get set, go】Day 25 - 將 API 結合 SQL 資料庫
下一篇
【하나, 둘, ready, get set, go】Day 27 - 整合 GitLab CI 來達成自動化編譯多架構 Docker Image
系列文
【하나, 둘, ready, get set, go】30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言